package com.ruoyi.system.service;

import java.util.List;
import java.util.Map;
import com.ruoyi.system.domain.*;

/**
 * MBTI测试Service接口
 * 
 * @author ruoyi
 * @date 2025-01-21
 */
public interface IMbtiTestService 
{
    /**
     * 获取所有可用的测试类型
     * 
     * @return 测试类型列表
     */
    public List<MbtiTestType> getAvailableTestTypes();

    /**
     * 根据测试类型ID获取测试详情
     * 
     * @param testTypeId 测试类型ID
     * @return 测试类型信息
     */
    public MbtiTestType getTestTypeById(Long testTypeId);

    /**
     * 开始测试
     * 
     * @param testTypeId 测试类型ID
     * @param userId 用户ID（可为空，匿名测试）
     * @param userName 用户姓名（可为空）
     * @param userEmail 用户邮箱（可为空）
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     * @return 测试记录ID
     */
    public Long startTest(Long testTypeId, Long userId, String userName, String userEmail, String ipAddress, String userAgent);

    /**
     * 获取测试题目列表
     * 
     * @param testTypeId 测试类型ID
     * @return 题目和选项列表
     */
    public List<Map<String, Object>> getTestQuestions(Long testTypeId);

    /**
     * 获取测试题目基本信息列表（仅包含ID和基本信息，用于按需加载优化）
     * 
     * @param testTypeId 测试类型ID
     * @return 题目基本信息列表
     */
    public List<Map<String, Object>> getTestQuestionBasics(Long testTypeId);

    /**
     * 批量获取题目详情
     * 
     * @param questionIds 题目ID列表
     * @return 题目详情列表
     */
    public List<Map<String, Object>> getQuestionsDetail(List<Long> questionIds);

    /**
     * 预加载题目（智能预加载相邻题目）
     * 
     * @param testTypeId 测试类型ID
     * @param currentIndex 当前题目索引
     * @param range 预加载范围
     * @return 预加载题目列表
     */
    public List<Map<String, Object>> preloadQuestions(Long testTypeId, Integer currentIndex, Integer range);

    /**
     * 获取单个题目详情
     * 
     * @param questionId 题目ID
     * @return 题目和选项信息
     */
    public Map<String, Object> getQuestionDetail(Long questionId);

    /**
     * 提交单个题目答案
     * 
     * @param recordId 测试记录ID
     * @param questionId 题目ID
     * @param optionId 选项ID
     * @return 是否成功
     */
    public boolean submitAnswer(Long recordId, Long questionId, Long optionId);

    /**
     * 批量提交答案
     * 
     * @param recordId 测试记录ID
     * @param answers 答案列表 Map<questionId, optionId>
     * @return 是否成功
     */
    public boolean submitAnswers(Long recordId, Map<Long, Long> answers);

    /**
     * 完成测试并计算结果
     * 
     * @param recordId 测试记录ID
     * @return 测试结果
     */
    public MbtiResult completeTest(Long recordId);

    /**
     * 获取测试结果
     * 
     * @param recordId 测试记录ID
     * @return 测试结果详情
     */
    public Map<String, Object> getTestResult(Long recordId);

    /**
     * 根据人格类型获取详细描述
     * 
     * @param personalityType 人格类型编码
     * @return 人格类型描述
     */
    public MbtiPersonalityType getPersonalityTypeDescription(String personalityType);

    /**
     * 重新计算测试结果
     *
     * @param recordId 测试记录ID
     * @return 测试结果
     */
    public MbtiResult calculateTestResult(Long recordId);

    /**
     * 获取用户的测试历史
     * 
     * @param userId 用户ID
     * @return 测试记录列表
     */
    public List<Map<String, Object>> getUserTestHistory(Long userId);

    /**
     * 获取测试进度
     * 
     * @param recordId 测试记录ID
     * @return 测试进度信息
     */
    public Map<String, Object> getTestProgress(Long recordId);

    /**
     * 放弃测试
     * 
     * @param recordId 测试记录ID
     * @return 是否成功
     */
    public boolean abandonTest(Long recordId);

    /**
     * 验证测试记录是否有效
     * 
     * @param recordId 测试记录ID
     * @return 是否有效
     */
    public boolean validateTestRecord(Long recordId);

    /**
     * 获取MBTI统计数据
     * 
     * @return 统计信息
     */
    public Map<String, Object> getMbtiStatistics();
}
